<!--
    与上级模块公用store，或者说混合和继承了改功能的组件将会被纳入上级模块中，视为同一个模块

    FIXME 子模块的使用限制和设计隐患
    子模块的store相关设置（components和method）依赖上级模块，并且是在子模块组件的首次初始化中注入组件的
    因此子模块只能使用固定的上级模块类型，若出现了不同的上级模块，由于属性注入只在第一次初始化时发生，后面的生成的组件都将于第首次生成的组件属性相同
    A方案
        每次创建组建实例，调用自定义组件初始化（Vue.extend）时，清除_Ctor标记，使得组件在每次初始化中都得以重新生成‘
        需要清除自定义状态标记
    B方案
        在组件的create中为当前实例动态添加额外属性
-->
<script>
import { copyProp } from "@/common";
import Helper from "store/helper";
import Base from "./storeModuleBase";
export default {
  extends: Base,
  created() {
    copyProp(this, this.$parentElement, [
      "$storeCode",
      "$parentStore",
      "$modulePath",
      "$pathCode",
      "$dispatch",
      "$commit",
      "$moduleContext",
      "$getters"
    ]);
    if (this.$parentElement.moduleState) {
      this.$set(this, "moduleState", this.$parentElement.moduleState);
    }
  },
  beforeCreate() {
    /**
         * TODO 增加简单的元素指定方法以及store调用方法
         * 提供可以快速调用模块store方法的工具对象
         * 提供可以快速指定单个绑定属性的
         * 为普通元素提供部分绑定和调用模块内store的方法（可添加 轻型子模块对象storeLightModule 或者 丰富该功能的选项设置）
         */
    this.$parentElement = Helper.getParentElement(this);
    let options = this.$options;
    if (options.storeMapping !== false) {
      //若子模块本体设置了moduleStore，则以子模的moduleStore为绑定源，这种情况下一般需要上级模块中moduleStore继承子模块的moduleStore（子模块一般设置基类store）才能使组件正常运行
      Helper.bindStoreOption(
        this,
        this.$options.moduleStore || this.$parentElement.$options.moduleStore
      );
    } else {
    }
  },
  methods: {}
};
</script>